[小ネタ]意図せずpackage-lock.jsonからプラットフォーム依存のパッケージが消えてCIが異常終了したので対応した話
リテールアプリ共創部@大阪の岩田です。
package-lock.json
を更新した直後からGitHub Actionsで実行しているCIジョブが異常終了するようになり、少しハマってしまったので情報共有のため経緯と対応方法をご紹介します。
経緯
今回問題となった事象ですが以下のような流れで発生しました。
-
mainブランチからfeatureブランチを切って作業を進める
- featureブランチの作業で
package.json
とpackage-lock.json
を更新する
- featureブランチの作業で
-
作業中にmainブランチに別のPRがマージされ、この際mainブランチの
package.json
とpackage-lock.json
も更新される -
作業が完了したのでfeatureブランチをmainブランチにマージするPRを作成する
-
コンフリクトが発生していることに気付き、ローカル環境にてmainブランチをfeatureブランチにマージしてコンフリクトを解消
package.json
のコンフリクト解消後、package-lock.json
については削除後にnpm install
を行い再作成
-
コンフリクトが解消できたのでリモートのfeatureブランチにプッシュ
-
CIが自動実行されエラーが発生!!
発生したエラーは具体的には以下のようなエラーでした。GitHub Actionsのジョブの中でbiome check
を実行しているのですが、その際'@biomejs/cli-linux-x64/biome
が見つからずにエラーになっているようです。
> biome check ./
node:internal/modules/cjs/loader:1147
throw err;
^
Error: Cannot find module '@biomejs/cli-linux-x64/biome'
Require stack:
- /home/runner/work/...略/node_modules/@biomejs/biome/bin/biome
at Module._resolveFilename (node:internal/modules/cjs/loader:1144:15)
at Function.resolve (node:internal/modules/helpers:187:19)
at Object.<anonymous> (/home/runner/work/...略/node_modules/@biomejs/biome/bin/biome:51:11)
at Module._compile (node:internal/modules/cjs/loader:1376:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
at Module.load (node:internal/modules/cjs/loader:1207:32)
at Module._load (node:internal/modules/cjs/loader:1023:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12)
at node:internal/main/run_main_module:28:49 {
code: 'MODULE_NOT_FOUND',
requireStack: [
'/home/runner/work/...略/node_modules/@biomejs/biome/bin/biome'
]
}
ローカルの開発環境にはM2 Macを利用しているので、CI環境とのアーキテクチャの差異が何かしら悪さをしてそうです。
原因
mainブランチとfeatureブランチの内容を比較したところ、package-lock.json
に以下のような差分が見つかりました。
- "node_modules/@biomejs/cli-linux-x64": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz",
- "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=14.21.3"
- }
- },
node_modules/@biomejs/biome
のoptionalDependencies
に含まれるnode_modules/@biomejs/cli-linux-x64
の記述が丸々消えてしまっています。
関連するメンバーの開発環境はすべてarm環境なので、単純にM2 Macでnpm install
するのがダメということは無いはずです。なぜpackage-lock.json
からx64環境向けのパッケージの記述が消えたんだ...と調べたところ、以下のissueを発見しました。
今回の事象に当てはめると、ローカル環境のnode_modules
配下に@biomejs/biome
がインストール済みの状態でpackage-lock.json
を削除後に再度npm install
してpackage-lock.json
を再生成すると、node_modules
配下に存在しないプラットフォーム依存のパッケージはpackage-lock.json
に書き込まれないようです。
開発環境はM2 Macなので、node_modules/@biomejs/
配下はbiome
とcli-darwin-arm64
のみ存在する状態です。この状態でnpm install
し直すとpackage-lock.json
にはnode_modules/@biomejs/biome
とnode_modules/@biomejs/cli-darwin-arm64
しか書き込まれないことになります。CI環境ではこのpackage-lock.json
を使ってnpm ci
していたので、@biomejs/cli-linux-x64
がインストールされずbiome check
の実行に失敗していたようです。
対応
原因が分かったので後は簡単です。
一旦node_modules
とpackage-lock.json
を削除してnpm install
し直しました。これで無事にpackage-lock.json
にnode_modules/@biomejs/cli-linux-x64
も書き出されました。
あとは更新後のpackage-lock.json
をコミット & プッシュしたところ、今度は正常にCIのジョブが完了しました。無事解決です。
まとめ
開発環境がAppleシリコン搭載のMacで、CI環境がx86環境というのはよくある環境だと思います。もしpackage.json
やpackage-lock.json
のコンフリクト解消後にプラットフォーム依存のパッケージがうまく見つからずにCIやCDのジョブが動かなくなった場合は、この記事を思い出してみてください。